#include"include/hashStack.h"


int hash(int key,int hash_len){

    return key%hash_len;
}

//初始化哈希栈
int hashStack_init(hashStack_t *hashStack,int hash_len){
    hashStack->hash_map=(hashNode_t**)calloc(hash_len,sizeof(hashNode_t*));
    if(hashStack->hash_map==NULL){
        return -1;
    }
    hashStack->hash_len=hash_len;
    
    for(int i=0;i<hash_len;i++){
        hashStack->hash_map[i]=NULL;
    }
    return 0;
}

//根据传入的key值找到对应的栈,如该栈不存在，创建栈并返回
// 根据传入的key值找到对应的栈,如该栈不存在，创建栈并返回
_dirStack_t *hashStack_get(hashStack_t *hashStack, int key, MYSQL* db, user_t *user) {
    
    int hash_index = hash(key, hashStack->hash_len);
    hashNode_t *node = hashStack->hash_map[hash_index];
    
    // 1. 处理哈希桶为空的情况
    if (node == NULL) {
        // 创建新节点
        hashNode_t *newNode = (hashNode_t*)calloc(1, sizeof(hashNode_t));
        if (!newNode) return NULL;
        
        // 创建并初始化目录栈
        _dirStack_t *dirStack = (_dirStack_t*)calloc(1, sizeof(_dirStack_t));
        if (!dirStack) {
            free(newNode);
            return NULL;
        }
        _dirStack_init(dirStack, db, user);
        
        // 设置新节点
        newNode->key = key;
        newNode->dirStack = dirStack;
        newNode->next = NULL;
        
        // 添加到哈希表
        hashStack->hash_map[hash_index] = newNode;
        return dirStack;
    }
    
    // 2. 处理哈希桶不为空的情况
    hashNode_t *prev = NULL;
    
    // 遍历链表查找key
    while (node != NULL) {
        if (node->key == key) {
            return node->dirStack;
        }
        prev = node;
        node = node->next;
    }
    
    // 3. 未找到，创建新节点
    hashNode_t *newNode = (hashNode_t*)calloc(1, sizeof(hashNode_t));
    if (!newNode) return NULL;
    
    // 创建并初始化目录栈
    _dirStack_t *dirStack = (_dirStack_t*)calloc(1, sizeof(_dirStack_t));
    if (!dirStack) {
        free(newNode);
        return NULL;
    }
    _dirStack_init(dirStack, db, user);
    
    // 设置新节点
    newNode->key = key;
    newNode->dirStack = dirStack;
    newNode->next = NULL;
    
    // 添加到链表尾部（使用prev指针）
    if (prev) {
        prev->next = newNode;
    }

    return dirStack;
}





